package cl.tinet.trainee.dao;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.Query;

import cl.tinet.trainee.model.CarroTO;
import cl.tinet.trainee.model.DetalleCarroTO;
import cl.tinet.trainee.model.ProductoTO;
import cl.tinet.trainee.model.UsuarioTO;


public class ProductosDAOImpl implements ProductosDAO{

	private EntityManager em;
	
	public ProductosDAOImpl(EntityManager em){
		this.em = em;
	}
	
	/**
	 * {@inheritDoc}
	 */
	public List<ProductoTO> listarProductos(int registrosPorPagina,int paginaActual) {
		
		Query query = em
				.createQuery("SELECT p FROM ProductoTO p where p.stock > 0");
		query.setFirstResult(paginaActual);
		query.setMaxResults(registrosPorPagina);		
		
		return (ArrayList<ProductoTO>) query.getResultList();
	}
	
	/**
	 * {@inheritDoc}
	 */
	public List<ProductoTO> listarTodosProductos(){
		
		Query query = em
				.createQuery("SELECT p FROM ProductoTO p where p.stock > 0");
				
		return (ArrayList<ProductoTO>) query.getResultList();
		
	}
	/**
	 * {@inheritDoc}
	 */
	public void crearCarro(CarroTO carroTO){
		
		em.persist(carroTO);		    	       
	    em.clear();	    	    
	}
	
	/**
	 * {@inheritDoc}
	 */
	public CarroTO cargarCarro(){
		
		try {
			Query query = em.createQuery("SELECT c FROM CarroTO c where c.compraFinalizada = 0");		
			return (CarroTO) query.getResultList().get(0); 		
					
		} catch (Exception e) {			
			return null;
		}
	}
	/**
	 * {@inheritDoc}
	 */
	public boolean agregarProducto(DetalleCarroTO detalleCarroTO){
		
		em.persist(detalleCarroTO);		  	       
	    em.clear();
		
		return false;
	}
	/**
	 * {@inheritDoc}
	 */
	public void descontarStock(ProductoTO productoTO) {
		em.merge(productoTO);			
	}
	
	/**
	 * {@inheritDoc}
	 */
	public void actualizarDetalle(DetalleCarroTO detalleCarroTO){	
				
		em.merge(detalleCarroTO);        
	}
	
	/**
	 * {@inheritDoc}
	 */
	public void actualizarProducto(ProductoTO productoTO){
		
		em.merge(productoTO);
	}
	
	/**
	 * {@inheritDoc}
	 */
	public void eliminarDetalle(DetalleCarroTO detalleCarroTO){
		
		em.remove(buscarDetalle(detalleCarroTO));		
	}
	
	/**
	 * {@inheritDoc}
	 */
	public DetalleCarroTO buscarDetalle(DetalleCarroTO detalleCarroTO){
		
		return em.find(DetalleCarroTO.class, detalleCarroTO.getIdDetalle());
	}
	
	/**
	 * {@inheritDoc}
	 */
	public UsuarioTO identificarUsuario(UsuarioTO usuarioTO){
		
		Query query = em.createQuery("SELECT u FROM UsuarioTO u where u.nombreUsuario = :nombreUsuario and u.pass = :pass");
		query.setParameter("nombreUsuario", usuarioTO.getNombreUsuario());
		query.setParameter("pass", usuarioTO.getPass());
		
		return (UsuarioTO) query.getSingleResult(); 
		
	}
	
	/**
	 * {@inheritDoc}
	 */
	public boolean registrarUsuario(UsuarioTO usuarioTO){
		try {
			em.persist(usuarioTO);
			
			return true;
		} catch (Exception e) {
			return false;
		}
	}
	
	/**
	 * {@inheritDoc}
	 */
	public boolean comprar(CarroTO carroTO){
		
		try {
			em.merge(carroTO);
			return true;
		} catch (Exception e) {
			return false;
		}
	}
	
	/**
	 * @return the em
	 */
	public EntityManager getEm() {
		return em;
	}
	/**
	 * @param em the em to set
	 */
	public void setEm(EntityManager em) {
		this.em = em;
	}

	

}
